// 继承
(function () {
    // 定义一个myDog类
    class myDog {
        name: string;
        age: number;

        constructor(name: string, age: number) {
            this.name = name;
            this.age = age;
        }

        sayHello() {
            console.log("汪汪汪！")
        }
    }
    // 定义一个猫类
    class myCat {
        name: string;
        age: number;

        constructor(name: string, age: number) {
            this.name = name;
            this.age = age;
        }

        sayHello() {
            console.log("喵喵喵！")
        }
    }
})()


// 定一个动物类
class Animal {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    sayHello() {
        console.log("动物叫！")
    }
}

// 定义myDog类继承animal
class myDog extends Animal {
    /* 
        此时，animal被称为父类，myDog被称为子类
        通过继承可以将多个类中共有的代码写在一个父类中
            这样只需要写一次即可通过继承使所有子类都同时拥有父类中的属性和方法
        使用继承后，子类将会用于父类所有的方法和属性（方法和属性都是静态和实例属性）,方法和属性不能是私有的
            如果希望子类中增加一些父类中没有的属性或方法直接编写添加就可（新增）
            如果之类中添加了和父类相同的方法，则子类方法会覆盖掉父类中的方法（重写）
     */

    // 方法重写(父类有则重写，父类没有则新添)
    sayHello() {
        console.log("汪汪汪！");
    }
    // 方法新增
    run() {
        console.log(this.name + "run~~~")
    }
}

// 定义myCat继承animal
class myCat extends Animal {

    sayHello() {
        console.log('喵喵喵！')
    }
}


const dog = new myDog('旺财', 2);
console.log(dog);
dog.sayHello();
dog.run();

const cat = new myCat('咪咪', 1);
console.log(cat);
cat.sayHello()

// 多态
let animal = new myDog('小狗狗', 22);
console.log('--------------------');
console.log(animal);
animal.sayHello()